package fr.upstlse.glre.client.administration.utilisateurs.action;

import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.widget.Info;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.google.gwt.user.client.rpc.AsyncCallback;

import fr.upstlse.glre.client.RfgConstante;
import fr.upstlse.glre.client.administration.utilisateurs.CreationPanel;
import fr.upstlse.glre.client.utilitaires.ControlerUtil;
import fr.upstlse.glre.client.vo.user.AdresseVOGWT;
import fr.upstlse.glre.client.vo.user.EtudiantVOGWT;
import fr.upstlse.glre.client.vo.user.ProfesseurVOGWT;
import fr.upstlse.glre.client.vo.user.UserRoleVOGWT;
import fr.upstlse.glre.client.vo.user.UserVOGWT;
import fr.upstlse.glre.client.widgets.fields.EtudiantFields;
import fr.upstlse.glre.client.widgets.fields.ProfesseurFields;
import fr.upstlse.glre.client.widgets.fields.UserFields;

public class CreateUserAction extends SelectionListener<ComponentEvent> {

	UserFields userFields;
	CreationPanel creationPanel;

	public CreateUserAction(UserFields userFields, CreationPanel creationPanel) {
		super();
		this.userFields = userFields;
		this.creationPanel = creationPanel;
	}

	public void componentSelected(ComponentEvent ce) {

		if (isFormularValid()) {
			String lSelectedRole = (String) userFields.getRole().getValue()
					.get(RfgConstante.ROLE_MODELDATA_ROLE);
			if (lSelectedRole.equals(UserRoleVOGWT.ADMIN.getValue())) {
				createAdmin();
			} 
			else if (lSelectedRole.equals(UserRoleVOGWT.ETUDIANT.getValue())) {
				createEtudiant();
			} 
			else if (lSelectedRole
					.equals(UserRoleVOGWT.PROFESSEUR.getValue())) {
				createProfesseur();
			}
			else if (lSelectedRole.equals(UserRoleVOGWT.SECRETAIRE.getValue())) {
				createSecretaire();
			}
			else {
				MessageBox.alert("Information", "Rôle " + lSelectedRole + " non pris en compte", null);
			}
		}
	}

	private void createAdmin() {
		UserVOGWT lUserVOGWT = new UserVOGWT();
		lUserVOGWT.setLogin((String) userFields.getLogin().getValue());
		lUserVOGWT.setPassword((String) userFields.getMotDePasse().getValue());
		lUserVOGWT.setRole(UserRoleVOGWT.ADMIN.getValue());

		final MessageBox lWaitMessageBox = MessageBox.progress("Information",
				"Création de l'administrateur", "création en cours...");
		AsyncCallback<Long> lCallback = new AsyncCallback<Long>() {
			public void onFailure(Throwable pCaught) {
				lWaitMessageBox.hide();
				MessageBox.alert("Erreur createUser", pCaught.getMessage(),
						null);
			}

			public void onSuccess(Long pResult) {
				lWaitMessageBox.hide();

				long lId = pResult.longValue();
				if (lId > 0) {
					Info.display("Information",
							"Administrateur créé avec succès", "");
				} else {
					MessageBox.alert("Erreur", "L'administrateur existe déjà",
							null);
				}
			}
		};
		ControlerUtil.getUserControlerServiceAsyncInstance().createUser(
				lUserVOGWT, lCallback);
	}

	private void createEtudiant() {
		EtudiantFields lEtudiantFields = (EtudiantFields) creationPanel
				.getAdditionalFields();
		AdresseVOGWT lAdresse = new AdresseVOGWT();
		lAdresse.setVoie((String) lEtudiantFields.getAdresseVoie().getValue());
		lAdresse.setCodepostal((String) lEtudiantFields.getAdresseCodePostal()
				.getValue());
		lAdresse
				.setVille((String) lEtudiantFields.getAdresseVille().getValue());
		lAdresse.setPays((String) lEtudiantFields.getAdressePays().getValue());

		EtudiantVOGWT lEtudiantVOGWT = new EtudiantVOGWT();
		lEtudiantVOGWT.setNom((String) lEtudiantFields.getNom().getValue());
		lEtudiantVOGWT.setPrenom((String) lEtudiantFields.getPrenom()
				.getValue());
		lEtudiantVOGWT.setEmail((String) lEtudiantFields.getEmail().getValue());
		lEtudiantVOGWT.setTelephonefixe((String) lEtudiantFields
				.getTelephoneFixe().getValue());
		lEtudiantVOGWT.setTelephoneportable((String) lEtudiantFields
				.getTelephonePortable().getValue());
		lEtudiantVOGWT.setLogin((String) userFields.getLogin().getValue());
		lEtudiantVOGWT.setPassword((String) userFields.getMotDePasse()
				.getValue());
		lEtudiantVOGWT.setRole(UserRoleVOGWT.ETUDIANT.getValue());
		lEtudiantVOGWT.setAdresse(lAdresse);

		final MessageBox lWaitMessageBox = MessageBox.wait("Information",
				"Création de l'étudiant", "création en cours...");
		AsyncCallback<Long> lCallback = new AsyncCallback<Long>() {
			public void onFailure(Throwable pCaught) {
				lWaitMessageBox.hide();
				final MessageBox lFailureMessageBox = MessageBox.alert(
						"Erreur getEtudiant", pCaught.getMessage(), null);
				lFailureMessageBox.show();
			}

			public void onSuccess(Long pResult) {
				lWaitMessageBox.hide();

				long lId = pResult.longValue();
				if (lId > 0) {
					Info
							.display("Information",
									"Étudiant créé avec succès", "");
				} else {
					MessageBox.alert("Erreur", "L'étudiant existe déjà", null);
				}
			}
		};
		ControlerUtil.getUserControlerServiceAsyncInstance().createEtudiant(
				lEtudiantVOGWT, lCallback);
	}

	private void createProfesseur() {
		ProfesseurFields lProfesseurFields = (ProfesseurFields) creationPanel
				.getAdditionalFields();

		ProfesseurVOGWT lProfesseurVOGWT = new ProfesseurVOGWT();
		lProfesseurVOGWT.setNom((String) lProfesseurFields.getNom().getValue());
		lProfesseurVOGWT.setPrenom((String) lProfesseurFields.getPrenom()
				.getValue());
		lProfesseurVOGWT.setEmail((String) lProfesseurFields.getEmail()
				.getValue());
		lProfesseurVOGWT.setEnseignement((String) lProfesseurFields
				.getEnseignement().getValue());
		lProfesseurVOGWT.setLogin((String) userFields.getLogin().getValue());
		lProfesseurVOGWT.setPassword((String) userFields.getMotDePasse()
				.getValue());
		lProfesseurVOGWT.setRole(UserRoleVOGWT.PROFESSEUR.getValue());

		final MessageBox lWaitMessageBox = MessageBox.progress("Information",
				"Création du professeur", "création en cours...");
		AsyncCallback<Long> lCallback = new AsyncCallback<Long>() {
			public void onFailure(Throwable pCaught) {
				lWaitMessageBox.hide();
				final MessageBox lFailureMessageBox = MessageBox.alert(
						"Erreur createProfesseur", pCaught.getMessage(), null);
				lFailureMessageBox.show();
			}

			public void onSuccess(Long pResult) {
				lWaitMessageBox.hide();

				long lId = pResult.longValue();
				if (lId > 0) {
					Info.display("Information", "Professeur créé avec succès",
							"");
				} else {
					MessageBox.alert("Information",
							"Le professeur existe déjà", null);
				}
			}
		};
		ControlerUtil.getUserControlerServiceAsyncInstance().createProfesseur(
				lProfesseurVOGWT, lCallback);
	}
	
	private void createSecretaire() {
		UserVOGWT lUserVOGWT = new UserVOGWT();
		lUserVOGWT.setLogin((String) userFields.getLogin().getValue());
		lUserVOGWT.setPassword((String) userFields.getMotDePasse().getValue());
		lUserVOGWT.setRole(UserRoleVOGWT.SECRETAIRE.getValue());

		final MessageBox lWaitMessageBox = MessageBox.progress("Information",
				"Création de la secretaire", "création en cours...");
		AsyncCallback<Long> lCallback = new AsyncCallback<Long>() {
			public void onFailure(Throwable pCaught) {
				lWaitMessageBox.hide();
				MessageBox.alert("Erreur createUser ", pCaught.getMessage(),
						null);
			}

			public void onSuccess(Long pResult) {
				lWaitMessageBox.hide();

				long lId = pResult.longValue();
				if (lId > 0) {
					Info.display("Information",
							"Secrétaire créée avec succès", "");
				} else {
					MessageBox.alert("Erreur", "La secrétaire existe déjà",
							null);
				}
			}
		};
		ControlerUtil.getUserControlerServiceAsyncInstance().createUser(
				lUserVOGWT, lCallback);
	}

	private boolean isFormularValid() {
		boolean lValid = true;
		if (userFields.getLogin().getValue() == null) {
			lValid = false;
			MessageBox.alert("Information",
					"Veuillez entrer un nom d'utilisateur", null);
		} else if (userFields.getMotDePasse().getValue() == null) {
			lValid = false;
			MessageBox.alert("Information", "Veuillez entrer un mot de passe",
					null);
		} else if (userFields.getRole().getValue() == null) {
			lValid = false;
			MessageBox.alert("Information", "Aucun rôle n'a été sélectionné",
					null);
		}

		return lValid;
	}

}
